import { indexForObjArr, clone, printErr } from '@/utils/index'
import test from '@/utils/test'

/**
 * @example 从数组通过Key查出对应的记录
 * @param {Array} arr 数组
 * @param {string | Number} searchValue 查询的数值
 * @param {string} key 在那个属性中查找,默认为ID字段
 * @returns {Object | null} 找到返回匹配对像,否则返回空
 */
export const find = (arr, searchValue, key = 'id') => {
	if (test.empty(searchValue)) return ''
	const i = indexForObjArr(arr, searchValue, key)
	return i >= 0 ? clone(arr[i]) : ''
}

/**
 * @example 状态为正常时的数值
 * @returns {Array} 状态为正常时的数值
 */
export const statusOk = (state, getters) => {
	const res = []
	for (let index = 0, len = state.length; index < len; index++) {
		const item = state[index]
		const { status, show } = item
		if (status || show) res.push(item)
	}
	return clone(res)
}

/**
 * @example 通过名称查出匹配对像
 * @returns {Object | null} 找到返回匹配对像,否则返回空
 */
export const findByName = (state, getters) => (name) => {
	return find(state, name, 'name')
}

/**
 * @example 通过ID查出匹配对像
 * @returns {Object | null} 找到返回匹配对像,否则返回空
 */
export const findById = (state, getters) => (id) => {
	return find(state, id, 'id')
}

/**
 * @example 通过ID查出匹配对像的名字属性
 * @param {String} name 对像的属性
 * @returns {Object | null} 找到返回匹配对像,否则返回空
 */
export const nameById = (state, getters) => (id, name = 'name') => {
	const obj = getters.findById(id)
	return obj ? obj[name] : ''
}

/**
 * @example 查出绑定会计科目编码的所有数组
 * @param  {String} num 科目编码字串
 * @returns {Array}  state的name名字属性的数据
 */
export const findIdsByNum = (state, getters) => (num, name = 'id') => {
	const res = []
	state.map(item => {
		if (item.num === num) res.push(item[name])
	})
	return clone(res)
}

/**
 * @example 通过名字模糊查询出对应的ID数组,主要不项目详情查询使用
 * @param  {Array} searchNames 查询的名字
 * @param  {String} key 查询的属性
 * @param  {Array} findIds 原的ID数组
 * @returns {Array}  state的id属性的数组
 */
export const findIdsByNames = (state, getters) => (findIds = [], searchNames = [], key = 'name') => {
	const res = []
	if (Array.isArray(searchNames) && searchNames.length > 0) {
		state.map(item => {
			const { id } = item
			// 查询属性字串中是否包含查询的字串
			const flag = searchNames.some(name => item[key].search(name) >= 0)
			// item的ID在原来的findIds数组中
			if (flag && findIds.includes(id)) res.push(id)
		})
	}
	return clone(res)
}

export default {
	statusOk,
	find,
	findById,
	findByName,
	findIdsByNum,
	findIdsByNames
	// findByAlias
}